use core::f32;



fn greet_world() {
    let southern_germany = "Grüß Gott!";
    let chinese = "你好， 世界！";
    let english = "Hello, World!";
    let regions = [southern_germany, chinese, english];
    // for region in regions.iter() { //Rust 的集合类型不能直接进行循环，需要变成迭代器（这里是通过 .iter() 方法），才能用于迭代循环
    for region in regions{ //在 2021 edition 及以后， for 隐式地将 regions 转换成迭代器。
        println!("{}", region);
    }
}

fn split_txt() {
    let penguin_data = "\
    common name,length (cm)
    Little penguin,33
    Yellow-eyed penguin,65
    Fiordland penguin,60
    Invalid,data
    ";

    let records = penguin_data.lines();

    for (i, record) in records.enumerate() {
        if 0 == i || record.trim().len() == 0 {
            continue;
        }

        // Vec 是 vector 的缩写，是一个可伸缩的集合类型，可以认为是一个动态数组
        // <_>表示 Vec 中的元素类型由编译器自行推断，在很多场景下，都会帮我们省却不少功夫
        let fields:Vec<_> = record
            .split(',') //  Rust 没有继承
            //高阶函数编程：函数可以作为参数,也能作为返回值;
            // map 方法中使用闭包函数作为参数，也可以称呼为 匿名函数、lambda 函数。
            .map(|field| field.trim()) 
            .collect();

        //  cfg!(debug_assertions)条件编译：debug
        if cfg!(debug_assertions) {
            eprintln!("{:?} -> {:?}", record, fields);
        }

        let name = fields[0];
        //  if let 是一个匹配表达式，用来从=右边的结果中，匹配出 length 的值
        if let Ok(length) = fields[1].parse::<f32>() { // 用 if let Err(e) = 匹配错误中情况
            println!("{}: {} cm", name, length);
        }
    }
}

fn main() {
    greet_world();

    split_txt();
}
